// 函数去抖
// 短时间内多次触发函数调用时
// 函数在**两次调用时间差达到规定的时间**时执行一次
// **两次调用时间差小于规定时间**时不执行函数

// 使用场景
// 1. 在`window.resize`时，不希望多次触发事件，以免影响性能，可以使用debounce函数
// 2. 在`autosearch`时, 也不希望每次删除或者输入时都search, 可以使用debounce处理

// 一个debounce的简单实现

/**
 * @param  {number} idle      空闲时间，单位毫秒
 * @param  {function} action  请求关联函数，实际应用需要调用的函数
 * @return {function}         返回客户调用函数
 */
// var debounce = function (idle, action) {
//   var last
//   return function () {
//     var ctx = this
//     var args = arguments
//     clearTimeout(last)
//     last = setTimeout(function () {
//       action.apply(ctx, args)
//     }, idle)
//   }
// }

// 参考文档
// http://www.cnblogs.com/fsjohnhuang/p/4147810.html

let { debounce } = require('lodash')
let moment = require('moment')

function trigger (fn, time = 10) {
  return setInterval(fn, time)
}

function test () {
  console.log(`i am here, 现在是：${moment().format('HH:mm ss')}`)
}

let tested = debounce(test, 1000, {
  // leading: false
  // maxWait: 2000 // 最大空闲时间，即超过这个时间后，函数必须执行一次
})

let timer = trigger(tested)

console.log('开始执行trigger')
console.log(`开始执行时间：${moment().format('HH:mm ss')}`)

setTimeout(() => {
  console.log('停止执行trigger')
  console.log(`停止执行时间：${moment().format('HH:mm ss')}`)
  timer && clearInterval(timer)
}, 3000)
